﻿/*
 * 
 * définit une contrainte physique d'un Joint de squelette, type Bras, vers un Point de l'espace physique
 * 
 * utilisation :
 * 
 * Sur Person par exemple :
 * for each ( var contrainte:Contrainte in contraintes ) cible = contrainte.correction( cible );
 * empeche le corps entier de s'éloigner du Point contrainte
 * 
 * */

package physic
{
	import events.MoveEvent;
	import fab.geom.Circle;
	import flash.geom.Point;
	import bipede.membres.PhysicBone;
	import bipede.membres.Squelette;
	import fl.ik.*;
	
	public class Contrainte extends Point
	{
		public var mobileBone:IKBone;
		public var attachBone:IKBone;
		//public var longueur:int;
		public var cercle:Circle;
		
		public function Contrainte( where:Squelette, p:Point, pBone:IKBone, aBone:IKBone )
		{
			mobileBone = pBone;
			attachBone = aBone;
			x = p.x;
			y = p.y;
			
			var d1:int = where.joint2root_distance_px( mobileBone.name );
			var d2:int = where.joint2root_distance_px( attachBone.name );
			var longueur:int = d1 - d2;
			
			cercle = new Circle( this as Point, longueur );
		}
		public function correction( cible:Point ):Point
		{
			var attachPoint:Point = attachBone.tailJoint.position;
			attachPoint = attachPoint.add( cible );
			
			attachPoint = cercle.projection( attachPoint );
			
			cible = attachPoint.subtract( attachBone.tailJoint.position );
			return cible;
		}
		public function update( event:MoveEvent ):void
		{
			updatePoint( event.point );
		}
		public function updatePoint( p:Point ):void
		{
			x = p.x;
			y = p.y;
		}		
		override public function toString():String
		{
			return "Contrainte " + x + ", " + y + ", rayon : " + cercle.rayon;
		}	
	}	
}